home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
DJGPP
/
DJ111M3.ZIP
/
go32
/
ed
/
symify.c
Wrap
C/C++ Source or Header
|
1994-02-09
|
3KB
|
133 lines
#include <stdio.h>
#include "ed.h"
#include "syms.h"
#define SC(r,c) (*(char *)(sc + (r)*ScreenCols() + (c)))
#define SW(r,c) (*(sc + (r)*ScreenCols() + (c)))
TSS a_tss;
main(int argc, char **argv)
{
int r, c;
short *sc;
char *n;
char buf[90];
int i, line;
word32 v;
word32 d;
char *func, *file;
FILE *ofile=0;
FILE *ifile=0;
if (argc < 2)
{
fprintf(stderr, "Usage: symify [-o <outfile>] [-i <corefile>] <program>\n");
fprintf(stderr, "This program replaces the stack dumps from go32 with debug info\n");
return 1;
}
while (argv[1][0] == '-')
{
if ((strcmp(argv[1], "-o") == 0) && (argc > 3))
{
ofile = fopen(argv[2], "w");
if (ofile == 0)
fprintf(stderr, "Error: unable to open file %s\n", argv[2]);
argc -= 2;
argv += 2;
}
if ((strcmp(argv[1], "-i") == 0) && (argc > 3))
{
ifile = fopen(argv[2], "r");
if (ifile == 0)
fprintf(stderr, "Error: unable to open file %s\n", argv[2]);
argc -= 2;
argv += 2;
}
}
syms_init(argv[1]);
if (ifile)
{
char line[1000];
if (ofile == 0)
ofile = stdout;
while (fgets(line, 1000, ifile))
{
if (strncmp(line, " 0x", 4) == 0)
{
int lineno;
sscanf(line+4, "%x", &v);
func = syms_val2name(v, &d);
file = syms_val2line(v, &lineno, 0);
fprintf(ofile, " 0x%08x", v);
if (func)
{
fprintf(ofile, " %s", func);
if (d)
fprintf(ofile, "%+d", d);
}
if (file)
{
if (func)
fprintf(ofile, ", ");
fprintf(ofile, "line %d of %s", lineno, file);
}
fputc('\n', ofile);
}
else
fputs(line, ofile);
}
return 0;
}
sc = (short *)malloc(ScreenRows() * ScreenCols() * 2);
ScreenRetrieve(sc);
for (r=0; r<ScreenRows(); r++)
{
if (SC(r,0) == ' ' && SC(r,1) == ' ' && SC(r,2) == '0' && SC(r,3) == 'x')
{
buf[8] = 0;
for (i=0; i<8; i++)
buf[i] = SC(r, i+4);
sscanf(buf, "%x", &v);
func = syms_val2name(v, &d);
file = syms_val2line(v, &line, 0);
buf[0] = 0;
if (func)
{
strcpy(buf, func);
if (d)
sprintf(buf+strlen(buf), "%+d", d);
}
if (file)
{
if (buf[0])
strcat(buf, ", ");
sprintf(buf+strlen(buf), "line %d of %s", line, file);
}
if (buf[0])
for (i=0; buf[i]; i++)
SW(r, 15+i) = 0x0f00 + buf[i];
}
}
if (ofile)
{
for (r=0; r<ScreenRows(); r++)
{
c = 0;
for (i=0; i<ScreenCols(); i++)
if (SC(r, i) != ' ')
c = i;
for (i=0; i<=c; i++)
fputc(SC(r,i), ofile);
fputc('\n', ofile);
}
fclose(ofile);
}
else
ScreenUpdate(sc);
}